import openai
from time import sleep

openai.api_key = "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"

def doRun():
    # 构建模型
    # 微调数据准备好后，我们就协议开始着手微调模型了。在开始微调训练之前，我们需要先确定微调的基础模型。

    # 每个微调工作都从一个基础模型开始，默认为curie。基础模型不同会影响模型的性能和微调模型的成本。目前支持微调的基础模型包括：ada、babbage、curie或davinci。

    # 下面是用Python完成模型构建：
    # 训练数据文件路径
    file_path = "file-BiYiSLQYv9ytcXWyIyw4pl2l"

    # 使用 GPT-3.5 进行 fine-tune
    resp = openai.FineTune.create(training_file=file_path, 			
                            #   validation_file=None, 
                            #   check_if_files_exist=True, 
                              model="ada",suffix="liaocat")
    job_id = resp["id"]
    status = resp["status"]
    print(f'微调任务ID: {job_id}，状态: {status}\n')

    # 微调模型
    # 微调任务创建之后通常处于Pending状态，这是因为OpenAI系统中通常有其他任务排在你之前，
    # 我们的任务会先放在队列中，等待被处理。一般来说一旦进入训练状态，微调训练可能需要几分钟或几小时，
    # 具体取决于选择的基础模型和数据集的大小。我们可以用微调任务id来查询微调任务的状态：
    while status not in ["succeeded", "failed"]:
        sleep(2)
        # 获取微调任务的状态
        status = openai.FineTune.retrieve(id=job_id)["status"]
        print(f'微调任务ID: {job_id}，状态: {status}')

    print(f'微调任务ID: {job_id} 完成， 结束状态: {status}\n')

    # 评估模型
    # 微调成功后都会有训练结果输出，可以通过如下代码获取评估结果：
    fine_tune = openai.FineTune.retrieve(id=job_id)
    result_files = fine_tune.get("result_files", [])
    if result_files:
        result_file = result_files[0]
        resp = openai.File.download(id=result_file["id"])
        print(resp.decode("utf-8"))
    # 这里有丰富的模型评估数据，供我们对模型微调质量进行评估。

    # 部署模型
    # 如果模型效果满意，我们就可以将模型投入生产使用了。openai.FineTune.retrieve()方法返回的数据结构中的fine_tuned_model就是微调后的模型名称。可以直接拿这个模型名称在API中使用。
    model_name = openai.FineTune.retrieve(id=job_id)["fine_tuned_model"]

    print('输出model_name:'+model_name)
    response = openai.Completion.create(
        model=model_name,
        prompt="若是金樽空对月\n",
        temperature=0.7,
        max_tokens=256,
        top_p=1,
        frequency_penalty=0,
        presence_penalty=0,
        stop=["END"]
    )
    message = response.choices[0].text
    print('测试响应：'+message)
def modelTest():
    response = openai.Completion.create(
        model='ada:ft-personal:liaocat-2023-03-11-11-18-13',
        prompt="若是金樽空对月\n",
        temperature=0.7,
        max_tokens=256,
        top_p=1,
        frequency_penalty=0,
        presence_penalty=0,
        stop=["END"]
    )
    message = response.choices[0].text
    print('测试响应：'+message)
def deleteModel():
    openai.Model.delete('ada:ft-personal:liaocat-2023-03-11-11-30-20')
    
if __name__ == '__main__':
    # doRun()
    # modelTest()
    deleteModel()